unit PesquisaDetalhamentoEstoqueCentroCusto;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, UFormPesquisa, DB, DBTables, StdCtrls, Grids, DBGrids, Buttons,
  ExtCtrls, CheckLst, Mask, ToolEdit, DBCtrls;

type
  TFPesquisaDetalheEstoqueCentroCusto = class(TFormPesquisa)
    Label16: TLabel;
    DBLCBCentroCusto: TDBLookupComboBox;
    SpeedButton3: TSpeedButton;
    Label9: TLabel;
    DEDataIni: TDateEdit;
    Label6: TLabel;
    DEDataFim: TDateEdit;
    CkBTodasEmpresas: TCheckBox;
    Label10: TLabel;
    CLBEmpresas: TCheckListBox;
    DSCentro: TDataSource;
    Label2: TLabel;
    DBLCBProduto: TDBLookupComboBox;
    DSProduto: TDataSource;
    Label1: TLabel;
    EGrupoTipoMovimentoestoque: TEdit;
    QDetalheEstoque: TQuery;
    procedure DBLCBCentroCustoKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure FormCreate(Sender: TObject);
    procedure CkBTodasEmpresasClick(Sender: TObject);
    procedure BtnConsultarClick(Sender: TObject);
    procedure BtnImprimirClick(Sender: TObject);
    procedure SpeedButton3Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure BtnLimparClick(Sender: TObject);
    procedure QDetalheEstoqueAfterPost(DataSet: TDataSet);
  private
    { Private declarations }
   procedure MontaDados;

  public
    { Public declarations }
  end;

var
  FPesquisaDetalheEstoqueCentroCusto: TFPesquisaDetalheEstoqueCentroCusto;
  S :String;
implementation

uses UDmFinanceiro, UDmGestao, CapturaCentroCusto, UGeral,
  RelatorioDetalhamentoEstoqueCentroCusto;

{$R *.dfm}
procedure TFPesquisaDetalheEstoqueCentroCusto.MontaDados;
Begin
 QPesquisa.First;
 while Not(QPesquisa.Eof) do
 begin
  if Not(QDetalheEstoque.Locate('EstruturaCentro;CodProduto',VarArrayOf([QPesquisa.fieldByname('ESTRUTURA').AsVariant,QPesquisa.fieldByname('PROD_CODIGO').AsVariant]),[locaseInsensitive]) ) then
   begin
    QDetalheEstoque.Append;
    QDetalheEstoque.FieldByName('ESTRUTURACENTRO').AsString:=QPesquisa.fieldByname('ESTRUTURA').AsString;
    QDetalheEstoque.FieldByName('DESCRICAOCENTRO').AsString:=QPesquisa.fieldByname('DESCRICAO').AsString;
    QDetalheEstoque.FieldByName('CODPRODUTO').AsInteger:=QPesquisa.fieldByname('PROD_CODIGO').AsInteger;
    QDetalheEstoque.FieldByName('PRODUTO').AsString:=QPesquisa.fieldByname('PROD_DESCRICAOENT').AsString;
    QDetalheEstoque.FieldByName('UNIDADE').AsString:=QPesquisa.fieldByname('PROD_UNIDSAIDA').AsString;
    QDetalheEstoque.FieldByName('REFERENCIA').AsString:=QPesquisa.fieldByname('PROD_REFERENCIA').AsString;
    if QPesquisa.FieldByName('TIPMOVEST_ENTRADASAIDA').AsString= planocontasentrada then
     QDetalheEstoque.FieldByName('QUANTIDADE').AsFloat:=QPesquisa.fieldByname('QUANTIDADE').AsFloat
    else
     QDetalheEstoque.FieldByName('QUANTIDADE').AsFloat:=-QPesquisa.fieldByname('QUANTIDADE').AsFloat;
    QDetalheEstoque.FieldByName('CONSUMO').AsFloat:=QPesquisa.fieldByname('CONSUMO').AsFloat;
    QDetalheEstoque.FieldByName('DEVOLUCAO').AsFloat:=QPesquisa.fieldByname('DEVOLUCAO').AsFloat;
    QDetalheEstoque.FieldByName('ENTRADASAIDA').AsString:=QPesquisa.fieldByname('TIPMOVEST_ENTRADASAIDA').AsString;
    QDetalheEstoque.Post;
   end
  else
   begin
    QDetalheEstoque.Edit;
    if QPesquisa.FieldByName('TIPMOVEST_ENTRADASAIDA').AsString= planocontasentrada then
     QDetalheEstoque.FieldByName('QUANTIDADE').AsFloat:=QDetalheEstoque.FieldByName('QUANTIDADE').AsFloat + QPesquisa.fieldByname('QUANTIDADE').AsFloat
    else
     QDetalheEstoque.FieldByName('QUANTIDADE').AsFloat:=QDetalheEstoque.FieldByName('QUANTIDADE').AsFloat - QPesquisa.fieldByname('QUANTIDADE').AsFloat;

    QDetalheEstoque.FieldByName('CONSUMO').AsFloat:=QDetalheEstoque.FieldByName('CONSUMO').AsFloat + QPesquisa.fieldByname('CONSUMO').AsFloat;
    QDetalheEstoque.FieldByName('DEVOLUCAO').AsFloat:=QDetalheEstoque.FieldByName('DEVOLUCAO').AsFloat+ QPesquisa.fieldByname('DEVOLUCAO').AsFloat;
    QDetalheEstoque.Post;
   end;
   QPesquisa.Next;
 end;
End;

procedure TFPesquisaDetalheEstoqueCentroCusto.DBLCBCentroCustoKeyDown(
  Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  inherited;
 case key of
  116 : begin
           TDBLookupComboBox(sender).ListSource.DataSet.Close;
           TDBLookupComboBox(sender).ListSource.DataSet.Open;
          end ;
 end;

 if key = 46 then
  TDBLookupComboBox(Sender).KeyValue:=null;

end;

procedure TFPesquisaDetalheEstoqueCentroCusto.FormCreate(Sender: TObject);
begin
  inherited;
 QPesquisa.Close;
 QPesquisa.SQL.Clear;
 QPesquisa.SQL.Add('Select Emp_Codigo,Emp_Fantasia from empresa');
 QPesquisa.Open;
 QPesquisa.First;
 CLBEmpresas.Items.Clear;
 while not(QPesquisa.Eof) do
 begin
  CLBEmpresas.Items.Add(QPesquisa.fieldByname('Emp_Codigo').AsString + '-' + QPesquisa.fieldByname('Emp_Fantasia').AsString );
  QPesquisa.Next;
 end;
 CkBTodasEmpresasClick(Sender);
 QPesquisa.Close;


end;

procedure TFPesquisaDetalheEstoqueCentroCusto.CkBTodasEmpresasClick(
  Sender: TObject);
Var
 i :Integer;
begin
  inherited;
 for i := 0 to CLBEmpresas.Items.Count - 1 do
  begin
   if StrToInt(Copy(CLBEmpresas.Items.Strings[i],1,pos('-',CLBEmpresas.Items.Strings[i])- 1)) = Codigoempresa then
    CLBEmpresas.Checked[i]:=true
   else
    CLBEmpresas.Checked[i]:=CkBTodasEmpresas.Checked;
  end;

end;

procedure TFPesquisaDetalheEstoqueCentroCusto.BtnConsultarClick(
  Sender: TObject);
begin
 Self.Cursor:=crHourGlass;
 QDetalheEstoque.close;
 QDetalheEstoque.SQL.Clear;
 QDetalheEstoque.SQL.Add('Delete From DETALHEESTOQUECentroCusto');
 QDetalheEstoque.ExecSQL;

 QDetalheEstoque.Close;
 QDetalheEstoque.SQL.Clear;
 QDetalheEstoque.SQL.Add('Select * From DETALHEESTOQUECentroCusto');
 QDetalheEstoque.SQL.Add('Order by EstruturaCentro');
 QDetalheEstoque.open;

 if (EmpresasDesmarcadas(CLBEmpresas) = CLBEmpresas.Items.Count) then
  CkBTodasEmpresasClick(Sender);
 S:=Concatenaempresas(CLBEmpresas);
 QPesquisa.Close;
 QPesquisa.SQL.Clear;
 QPesquisa.SQL.Add('Select CentroCusto.estrutura,CentroCusto.Descricao,Prod_codigo,Prod_DescricaoEnt,Prod_UnidSaida,Prod_Referencia,Sum(ItensMovEst_Quantidade) as Quantidade,0.0 as Consumo,');
 QPesquisa.SQL.Add('Sum(ItensMovEst_Quantidade * ItensMovEst_ValorC) as Devolucao,TIPMOVEST_ENTRADASAIDA ');
 QPesquisa.SQL.Add(' From CentroCusto inner join(TipoMovimentoEstoque Right join ( MovimentoEstoque inner join (ItensMovimentoEstoque Inner Join Produto on ItensMovEst_Produto = Prod_Codigo )');
 QPesquisa.SQL.Add(' on ItensMovEst_MovimentoEstoque = MovEst_Codigo)  on  TipMovEst_Codigo = MovEst_TipoMovimento )On CentroCusto.Codigo = MOVEST_Centrocusto ');
 QPesquisa.SQL.Add('Where (MovimentoEstoque.Codigoempresa in ( ' + s + ') ) and (TIPMOVEST_ENTRADASAIDA = :Ent)');
 QPesquisa.ParamByName('Ent').AsString:=PlanoContasEntrada;

 if DBLCBCentroCusto.Text <> '' then
  begin
   QPesquisa.SQL.Add(' and (CentroCusto.Estrutura like :EstC)');
   QPesquisa.ParamByName('EstC').AsString:=DMFinanceiro.QCentro.fieldByname('Estrutura').AsString + '%';
  end;

 if DBLCBProduto.Text <> '' then
  begin
   QPesquisa.SQL.Add(' and (ItensMovEst_Produto = :Prod) ');
   QPesquisa.ParamByName('Prod').AsInteger:=DBLCBProduto.KeyValue;
  end;

 if EGrupoTipoMovimentoestoque.Text <> '' then
  begin
   QPesquisa.SQL.Add(' and (TIPMOVEST_GRUPO = :Grup)');
   QPesquisa.ParamByName('Grup').AsString:=EGrupoTipoMovimentoestoque.Text;
  end;

 if (DEDataIni.Date <> 0)  and (DEDataFim.Date <> 0) then
  begin
   QPesquisa.SQL.Add(' and (MovEst_DataLancamento Between :DI and :DF) ');
   QPesquisa.ParamByName('DI').AsDate:=DEDataIni.Date;
   QPesquisa.ParamByName('DF').AsDate:=DEDataFim.Date;
  end;

 QPesquisa.SQL.Add('Group By CentroCusto.estrutura ,CentroCusto.Descricao ,Prod_codigo,Prod_DescricaoEnt,TIPMOVEST_ENTRADASAIDA,Prod_UnidSaida,Prod_Referencia ');

 QPesquisa.SQL.Add(' UNION ');

 QPesquisa.SQL.Add('Select CentroCusto.estrutura,CentroCusto.Descricao,Prod_codigo,Prod_DescricaoEnt,Prod_UnidSaida,Prod_Referencia,Sum(ItensMovEst_Quantidade) as Quantidade, Sum(ItensMovEst_Quantidade * ItensMovEst_ValorC) as Consumo,');
 QPesquisa.SQL.Add('0.0 as Devolucao,TIPMOVEST_ENTRADASAIDA ');
 QPesquisa.SQL.Add('From CentroCusto inner join(TipoMovimentoEstoque Right join ( MovimentoEstoque inner join (ItensMovimentoEstoque Inner Join Produto on ItensMovEst_Produto = Prod_Codigo ) on ItensMovEst_MovimentoEstoque = MovEst_Codigo) ');
 QPesquisa.SQL.Add('  on  TipMovEst_Codigo = MovEst_TipoMovimento ) On CentroCusto.Codigo = MOVEST_Centrocusto ');
 QPesquisa.SQL.Add('Where (MovimentoEstoque.Codigoempresa in ( ' + s + ') ) and (TIPMOVEST_ENTRADASAIDA = :Said)');
 QPesquisa.ParamByName('Said').AsString:=PlanoContasSaida;


 if DBLCBCentroCusto.Text <> '' then
  begin
   QPesquisa.SQL.Add(' and (CentroCusto.Estrutura like :EstC)');
   QPesquisa.ParamByName('EstC').AsString:=DMFinanceiro.QCentro.fieldByname('Estrutura').AsString + '%';
  end;

 if DBLCBProduto.Text <> '' then
  begin
   QPesquisa.SQL.Add(' and (ItensMovEst_Produto = :Prod) ');
   QPesquisa.ParamByName('Prod').AsInteger:=DBLCBProduto.KeyValue;
  end;

 if EGrupoTipoMovimentoestoque.Text <> '' then
  begin
   QPesquisa.SQL.Add(' and (TIPMOVEST_GRUPO = :Grup)');
   QPesquisa.ParamByName('Grup').AsString:=EGrupoTipoMovimentoestoque.Text;
  end;

 if (DEDataIni.Date <> 0)  and (DEDataFim.Date <> 0) then
  begin
   QPesquisa.SQL.Add(' and (MovEst_DataLancamento Between :DI and :DF) ');
   QPesquisa.ParamByName('DI').AsDate:=DEDataIni.Date;
   QPesquisa.ParamByName('DF').AsDate:=DEDataFim.Date;
  end;

 QPesquisa.SQL.Add('Group By CentroCusto.estrutura ,CentroCusto.Descricao ,Prod_codigo,Prod_DescricaoEnt,TIPMOVEST_ENTRADASAIDA,Prod_UnidSaida,Prod_Referencia ');
 QPesquisa.Open;

 MontaDados;
 Self.Cursor:=crDefault;
 DSPesquisa.DataSet:=QDetalheEstoque;
 BtnImprimir.Enabled:=QDetalheEstoque.RecordCount <> 0;
 BtnSelecionar.Enabled:=False;
 LRegistros.Caption:='Registros Encontrados : ' + IntToStr(QDetalheEstoque.RecordCount);
// inherited;

end;

procedure TFPesquisaDetalheEstoqueCentroCusto.BtnImprimirClick(
  Sender: TObject);
begin
  inherited;
 Application.CreateForm(TFRelatorioDetalheEstoqueCentroCusto, FRelatorioDetalheEstoqueCentroCusto);
 with FRelatorioDetalheEstoqueCentroCusto do
  begin
   Query1.close;
   Query1.SQL.Clear;
   Query1.SQL:=QDetalheEstoque.SQL;
   Query1.Params:=QDetalheEstoque.Params;
   Query1.Open;

   QRLNomeRelatorio.Caption:='CONSUMO POR CENTRO DE CUSTO - DETALHADO';
   QRLData.Caption:=DEDataIni.Text + ' a ' + DEDataFim.Text;
   QuickRep1.DataSet:=Query1;
   QuickRep1.Prepare;
   QuickRep1.Preview;
   close;
  end; // With

end;

procedure TFPesquisaDetalheEstoqueCentroCusto.SpeedButton3Click(
  Sender: TObject);
begin
  inherited;
 if FCapturaCentroCusto = nil then
    Application.CreateForm(TFCapturaCentroCusto, FCapturaCentroCusto);
 FCapturaCentroCusto.Tela:='DETALHAMENTOESTOQUECENTRO';
 FCapturaCentroCusto.show;

end;

procedure TFPesquisaDetalheEstoqueCentroCusto.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
 FPesquisaDetalheEstoqueCentroCusto:=nil;
 inherited;
end;

procedure TFPesquisaDetalheEstoqueCentroCusto.BtnLimparClick(
  Sender: TObject);
begin
  inherited;
 DBLCBCentroCusto.KeyValue:=null;
 DBLCBProduto.KeyValue:=null;
 EGrupoTipoMovimentoestoque.Text:='';
 DEDataIni.Date:=0;
 DEDataFim.Date:=0;

end;

procedure TFPesquisaDetalheEstoqueCentroCusto.QDetalheEstoqueAfterPost(
  DataSet: TDataSet);
begin
  inherited;
 QDetalheEstoque.Close;
 QDetalheEstoque.Open;

end;

end.
